package easyexcel;

import cn.hutool.core.date.DateUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.util.MapUtils;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import easyexcel.entity.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @author ZH
 * Date: 2022/7/6
 */
public class ImportTest {
    public static void main(String[] args) {
        String fileName = "C:\\Users\\zh\\Desktop\\test.xlsx";
        String templateFileName = "C:\\Users\\zh\\Desktop\\template.xlsx";
        int[] mergeColumeIndex = {0,1,2,3,4,5};//需要合并的列
        int mergeRowIndex = 3;// 从那一行开始合并
        //合并单元格
        try {
            List<Component> data = data();

            // 方案1
            try (ExcelWriter excelWriter = EasyExcel.write(fileName)
                    .withTemplate(templateFileName)
                    .build()) {
                WriteSheet writeSheet = EasyExcel.writerSheet().build();
                // 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行，然后下面的数据往后移动。默认 是false，会直接使用下一行，如果没有则创建。
                // forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了，所以慎用
                // 简单的说 如果你的模板有list,且list不是最后一行，下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存
                // 如果数据量大 list不是最后一行 参照下一个
                FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
                excelWriter.fill(data, fillConfig, writeSheet);
                Map<String, Object> map = MapUtils.newHashMap();
                map.put("date", DateUtil.now());
                map.put("total", 1000);
                excelWriter.fill(map, writeSheet);
            }



            /**
             * 简单填充
             */
            //EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(data());

        }catch (Exception e){
            e.printStackTrace();
        }
    }
    private static List<Component> data(){
        List<Component> data = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            Component component = new Component();
            component.setNo(String.valueOf(i));
            component.setCode("AAAAA" + i);
            component.setPartCode("BBBBB" + i / 10);
            component.setDept("采购");
            data.add(component);
        }
        return data;
    }
}
